package com.zkh.myutils.utils;

import java.lang.reflect.Array;

/**
 * 基本类型数组和包装类数组互转
 * @author zkh
 */
public class TypeUtils {
	/**
	 * byte[]转Byte[]
	 * @param arr 原数组
	 */
	public static Byte[] toWrap(byte[] arr){
		return (Byte[]) convert(arr, byte.class, Byte.class, null);
	}
	/**
	 * short[]转Short[]
	 * @param arr 原数组
	 */
	public static Short[] toWrap(short[] arr){
		return (Short[]) convert(arr, short.class, Short.class, null);
	}
	/**
	 * int[]转Integer[]
	 * @param arr 原数组
	 */
	public static Integer[] toWrap(int[] arr){
		return (Integer[]) convert(arr, int.class, Integer.class, null);
	}
	/**
	 * long[]转Long[]
	 * @param arr 原数组
	 */
	public static Long[] toWrap(long[] arr){
		return (Long[]) convert(arr, long.class, Long.class, null);
	}
	/**
	 * float[]转Float[]
	 * @param arr 原数组
	 */
	public static Float[] toWrap(float[] arr){
		return (Float[]) convert(arr, float.class, Float.class, null);
	}
	/**
	 * double[]转Double[]
	 * @param arr 原数组
	 */
	public static Double[] toWrap(double[] arr){
		return (Double[]) convert(arr, double.class, Double.class, null);
	}
	/**
	 * char[]转Character[]
	 * @param arr 原数组
	 */
	public static Character[] toWrap(char[] arr){
		return (Character[]) convert(arr, char.class, Character.class, null);
	}
	/**
	 * boolean[]转Boolean[]
	 * @param arr 原数组
	 */
	public static Boolean[] toWrap(boolean[] arr){
		return (Boolean[]) convert(arr, boolean.class, Boolean.class, null);
	}
	/**
	 * Byte[]转byte[]
	 * @param arr 原数组
	 */
	public static byte[] toBase(Byte[] arr){
		return (byte[]) convert(arr, Byte.class, byte.class, (byte) 0);
	}
	/**
	 * Short[]转short[]，数组内的项为null时，默认0
	 * @param arr 原数组
	 */
	public static short[] toBase(Short[] arr){
		return (short[]) convert(arr, Short.class, short.class, (short) 0);
	}
	/**
	 * Integer[]转int[]，数组内的项为null时，默认0
	 * @param arr 原数组
	 */
	public static int[] toBase(Integer[] arr){
		return (int[]) convert(arr, Integer.class, int.class, (int) 0);
	}
	/**
	 * Long[]转long[]，数组内的项为null时，默认0
	 * @param arr 原数组
	 */
	public static long[] toBase(Long[] arr){
		return (long[]) convert(arr, Long.class, long.class, (long) 0);
	}
	/**
	 * Float[]转float[]，数组内的项为null时，默认0.0
	 * @param arr 原数组
	 */
	public static float[] toBase(Float[] arr){
		return (float[]) convert(arr, Float.class, float.class, (float) 0.0);
	}
	/**
	 * Double[]转double[]，数组内的项为null时，默认0.0
	 * @param arr 原数组
	 */
	public static double[] toBase(Double[] arr){
		return (double[]) convert(arr, Double.class, double.class, 0.0);
	}
	/**
	 * Character[]转char[]，数组内的项为null时，默认空格字符
	 * @param arr 原数组
	 */
	public static char[] toBase(Character[] arr){ 
		return (char[]) convert(arr, Character.class, char.class, ' ');
	}
	/**
	 * Boolean[]转boolean[]，数组内的项为null时，默认false
	 * @param arr 原数组
	 */
	public static boolean[] toBase(Boolean[] arr){
		return (boolean[]) convert(arr, Boolean.class, boolean.class, false);
	}
	
	/**
	 * 数组转换公共方法
	 * @param arr 源数组
	 * @param from 源数组元素类型
	 * @param to 目标数组元素类型
	 * @param dftval 默认值
	 */
	private static Object convert(Object arr, Class<?> from, Class<?> to, Object dftval) {
		if(arr==null) {
			return null;
		}
		//数组长度
		int len = Array.getLength(arr);
		//创建目标数组
		Object tgt = Array.newInstance(to, len);
		//遍历赋值
		for(int i=0;i<len;i++) {
			//当前值
			Object obj = Array.get(arr, i);
			//新数组设置值
			Array.set(tgt, i, obj==null ? dftval : obj);
		}
		return tgt;
	}
}
